#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e3 + 10; 

double dp[maxn][maxn]; // 求期望用 倒推 表示我们已经玩过 i 中 职业 j 中阵营后 还需要 几天才能玩遍

int n, m;
void solve(){
	cin>>n>>m;
	dp[n][m] = 0;// 表示我们已经玩过 n 中 职业 m 中阵营后 还需要 几天才能玩遍
	
	// 从 i,j 到 
	// p(i+1, j)=(n-i)/n * (j)/m 
	// p(i, j+1) = i/n * (m-j)/m
	// p(i+1, j+1) = (n-i)/n * ((m-j)/m)
	// p(i, j) = i/n * j/m
	// dp[i][j] = p1*(i+1, j) + p2*(i, j+1) + p3*(i+1, j+1) + p4*(i, j)
	// (1-p4)dp[i][j] = ...
	// dp[i][j] = .../(1-p4)
	
	
	
	for (int i=n;i>=0;i--) {
		for (int j=m;j>=0;j--) {
			if (i==n&&j==m) {
				continue;
			}
			dp[i][j] = (dp[i+1][j]*((n-i)*j)+dp[i][j+1]*(i*(m-j)) 
				+ dp[i+1][j+1]*((n-i)*(m-j))+n*m)/(m*n-i*j); // +1 表示需要消耗 1 天
		}
	}
	
	cout<<fixed<<setprecision(4)<<dp[0][0]<<'\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
